package com.juejin.www.dao;

import com.juejin.www.model.DO.User;
import com.juejin.www.model.DTO.UserDTO;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * @author Jacky
 */
@Mapper
public interface UserDao {

    /**
     * 根据用户名和密码查找用户
     * @param userDTO 查找的用户实体
     * @return 查找到的结果
     */
    @Select("select * from users where username = #{username} and password = #{password}")
    UserDTO getByUsernameAndPassword(UserDTO userDTO);

    /**
     * 根据用户名查找对应盐值
     * @param username 用户名
     * @return 对应盐值
     */
    @Select("select salt from users where username = #{username}")
    String getSaltByUsername(String username);

    /**
     * 添加用户
     * @param user 添加的用户实体
     */
    @Insert("insert into users(id,username,password,salt,name,gender,job,address,follow_count,be_followed_count,status,create_time,update_time) " +
            "values (null,#{username},#{password},#{salt},#{name},#{gender},#{job},#{address},0,0,1,#{createTime},#{updateTime})")
    void insertUser(User user);

    /**
     * 根据用户名查找用户
     * @param username 查找的用户实体
     * @return 查找到的结果
     */
    @Select("select * from users where username = #{username}")
    UserDTO getByUsername(String username);

    /**
     * 根据id查找用户名
     * @param id 用户id
     * @return 用户名
     */
    @Select("select username from users where id=#{id}")
    String getUsername(Integer id);

    /**
     * 注册用户时将用户添加至用户角色关系表并设成用户角色
     * @param uid 用户id
     * @param rid 身份id
     */
    @Insert("insert into rel_user_role(id,uid,rid) values (null,#{uid},#{rid})")
    void insertRelUserRole(Integer uid,Integer rid);

    /**
     * 获取用户列表
     * @param begin 开始索引
     * @param pageSize 查询数目
     * @return 用户列表
     */
    @Select("select * from users where gender is not null limit #{begin},#{pageSize}")
    List<User> getList(Integer begin,Integer pageSize);

    /**
     * 获取用户总数
     * @return 用户总数
     */
    @Select("select count(*) from users where gender is not null")
    Integer getUsersTotalCount();

    /**
     * 通过id查找用户
     * @param id 用户id
     * @return 用户实体
     */
    @Select("select * from users where id = #{id}")
    UserDTO getById(Integer id);

    /**
     * 通过用户id查找用户身份
     * @param uid 用户id
     * @return 身份id
     */
    @Select("select rid from rel_user_role where uid = #{uid}")
    Integer getRole(Integer uid);

    /**
     * 判断某身份是否有某权限
     * @param rid 身份id
     * @param pid 权限id
     * @return 查找结果
     */
    @Select("select count(*) from rel_role_perm where rid = #{rid} and pid = #{pid}")
    int hasPermission(Integer rid,Integer pid);

    /**
     * 通过权限名获取权限id
     * @param permission 权限名
     * @return 权限id
     */
    @Select("select id from perms where permission=#{permission}")
    Integer getPid(String permission);

    /**
     * 查询关注状态
     * @param id 被关注者
     * @param uid 关注者
     * @return 查询数目
     */
    @Select("select count(*) from follows where follower=#{uid} and be_followed=#{id}")
    Integer checkFollow(Integer id,Integer uid);

    /**
     * 关注用户
     * @param follower 关注者
     * @param beFollowed 被关注者
     */
    @Insert("insert into follows(id, follower, be_followed) " +
            "values (null,#{follower},#{beFollowed})")
    void followUser(Integer follower,Integer beFollowed);

    /**
     * 添加关注着关注数
     * @param follower 关注者
     */
    @Update("update users set follow_count = follow_count+1 where id = #{follower}")
    void addFollowCount(Integer follower);

    /**
     * 添加被关注着被关注数
     * @param beFollowed 被关注者
     */
    @Update("update users set be_followed_count = be_followed_count+1 where id = #{beFollowed}")
    void addBeFollowedCount(Integer beFollowed);

    /**
     * 取消关注
     * @param follower 关注者
     * @param beFollowed 被关注者
     */
    @Delete("delete from follows where follower=#{follower} and be_followed=#{beFollowed}")
    void cancelFollow(Integer follower,Integer beFollowed);

    /**
     * 减少关注数
     * @param follower 关注者
     */
    @Update("update users set follow_count = follow_count-1 where id = #{follower}")
    void reduceFollowCount(Integer follower);

    /**
     * 减少被关注数
     * @param beFollowed 被关注者
     */
    @Update("update users set be_followed_count = be_followed_count-1 where id = #{beFollowed}")
    void reduceBeFollowedCount(Integer beFollowed);
}
